Phân bổ trễ và mất dữ liệu tiềm năng Ext4

Do phân trễ làm thay đổi hành vi mà các lập trình viên đã dựa vào ext3, tính năng này gây ra một số rủi ro mất dữ liệu bổ sung trong trường hợp hệ thống gặp sự cố hoặc mất điện trước khi tất cả dữ liệu được ghi vào đĩa. Do đó, ext4 trong các phiên bản kernel 2.6.30 trở lên sẽ tự động xử lý các trường hợp này như ext3.

Kịch bản điển hình trong đó điều này có thể xảy ra là một chương trình thay thế nội dung của file mà không buộc ghi vào đĩa bằng fsync. Có hai cách phổ biến để thay thế nội dung của file trên các hệ thống Unix:[20]

  • fd=open("file", O_TRUNC); write(fd, data); close(fd);
Trong trường hợp này, một file hiện có bị cắt ngắn tại thời điểm mở (do cờ O_TRUNC), sau đó dữ liệu mới được ghi ra. Vì việc ghi có thể mất một thời gian, có thể mất cơ hội ngay cả với ext3, nhưng thường rất nhỏ. Tuy nhiên, vì ext4 có thể trì hoãn việc ghi dữ liệu file trong một thời gian dài, cơ hội này lớn hơn nhiều.Có một số vấn đề có thể phát sinh:
  1. Nếu việc ghi không thành công (có thể do điều kiện lỗi trong chương trình ghi hoặc do các điều kiện bên ngoài như đĩa đầy), thì cả phiên bản gốc và phiên bản mới của file sẽ bị mất và file có thể bị hỏng vì chỉ một phần của nó đã được ghi.
  2. Nếu các tiến trình khác truy cập file trong khi nó đang được ghi, chúng sẽ thấy một phiên bản bị hỏng.
  3. Nếu các tiến trình khác mở file và không mong đợi nội dung của nó thay đổi, các tiến trình đó có thể bị crash. Một ví dụ đáng chú ý là một file thư viện dùng chung được ánh xạ vào các chương trình đang chạy.
Do những vấn đề này, thường thì câu lệnh sau được ưa thích hơn so với câu trên:
  • fd=open("file.new"); write(fd, data); close(fd); rename("file.new", "file");
Một file tạm mới ("file.new") được tạo, ban đầu chứa nội dung mới. Sau đó, file mới được đổi tên trên file cũ. Việc thay thế các file bằng lời gọi rename() được đảm bảo là nguyên tử theo tiêu chuẩn POSIX - tức là file cũ vẫn còn hoặc bị ghi đè bằng file mới. Vì chế độ ghi nhật ký "được đặt hàng" mặc định của ext3 đảm bảo dữ liệu file được ghi trên đĩa trước siêu dữ liệu, kỹ thuật này đảm bảo rằng nội dung file cũ hoặc mới sẽ tồn tại trên đĩa. Phân bổ trễ của ext4 phá vỡ kỳ vọng này, vì việc ghi file có thể bị trễ trong một thời gian dài và việc đổi tên thường được thực hiện trước khi nội dung file mới đến đĩa.

Sử dụng fsync() thường xuyên hơn để giảm rủi ro cho ext4 có thể dẫn đến các hình phạt về hiệu năng đối với các hệ thống file ext3 được gắn cờ data=ordered (mặc định trên hầu hết các bản phân phối Linux). Cho rằng cả hai hệ thống file sẽ được sử dụng trong một thời gian, điều này làm phức tạp vấn đề cho các nhà phát triển ứng dụng người dùng cuối. Đáp lại, ext4 trong nhân Linux 2.6.30 và mới hơn phát hiện sự xuất hiện của các trường hợp phổ biến này và buộc các file phải được phân bổ ngay lập tức. Với một phí tổn nhỏ trong hiệu suất, điều này cung cấp ngữ nghĩa tương tự như chế độ được đặt hàng ext3 và tăng khả năng một trong hai phiên bản của file sẽ sống sót sau sự cố. Hành vi mới này được kích hoạt theo mặc định, nhưng có thể bị vô hiệu hóa với tùy chọn gắn kết "noauto_da_alloc".[20]

Các bản vá mới đã trở thành một phần của kernel dòng chính 2.6.30, nhưng các bản phân phối khác nhau đã chọn backport chúng thành 2.6.28 hoặc 2.6.29.[21]

Các bản vá này hoàn toàn không ngăn chặn mất dữ liệu tiềm năng hoặc trợ giúp với các file mới. Cách duy nhất để an toàn là viết và sử dụng phần mềm thực hiện fsync() khi cần. Các vấn đề về hiệu năng có thể được giảm thiểu bằng cách hạn chế ghi đĩa quan trọng cần fsync() xảy ra ít thường xuyên hơn.[22]

Liên quan

Tài liệu tham khảo

WikiPedia: Ext4 http://www.ext2fsd.com/ http://www.h-online.com/open/features/Kernel-Log-H... http://www.h-online.com/open/news/item/Android-2-3... http://www.ibm.com/developerworks/linux/library/l-... http://www.paragon-software.com/home/extfs-mac/ http://www.paragon-software.com/home/extfs-windows... http://www.soluvas.com/read-browse-explore-open-ex... http://www.ubuntugeek.com/how-to-read-ext3ext4-lin... http://www.cs.wisc.edu/wind/Publications/iron-sosp... http://ext2read.sourceforge.net/